home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / nktools.zip / MATHUTIL.PAS < prev    next >
Pascal/Delphi Source File  |  1990-04-22  |  6KB  |  237 lines

  1. UNIT MathUtil;
  2. (*====================================================================*\
  3. || MODULE NAME:  MathUtil                                             ||
  4. || DEPENDENCIES: System.TPU                                           ||
  5. || LAST MOD ON:  9004.22                                              ||
  6. || PROGRAMMERS:  Andrea Spilholtz, Mike Temkin, SteveAlter,           ||
  7. ||               Naoto Kimura                                         ||
  8. ||                                                                    ||
  9. || DESCRIPTION:  This unit contains miscallaneous math routines.      ||
  10. ||                                                                    ||
  11. || Modification history                                               ||
  12. || 8907.10       Naoto Kimura                                         ||
  13. ||               * original version                                   ||
  14. || 8911.30       Naoto Kimura                                         ||
  15. ||               * Added Bound and RBound functions                   ||
  16. || 9004.22       Naoto Kimura                                         ||
  17. ||               * Fixed typo in NumBits                              ||
  18. \*====================================================================*)
  19.  
  20. {$S+}    {Stack checking on}
  21. {$R+}    {Range checking on}
  22. {$D-}    {Debug info off}
  23. {$I-}    {I/O checking off}
  24.  
  25. INTERFACE
  26.  
  27. FUNCTION Max( i1, i2 : integer ) : integer;
  28.  
  29. FUNCTION Min( i1, i2 : integer ) : integer;
  30.  
  31. FUNCTION Bound( i, Low, High : Integer ) : Integer;
  32.  
  33. FUNCTION Sgn( i : real ) : integer;
  34.  
  35. FUNCTION Sign ( I : Integer ): Integer;
  36.  
  37. FUNCTION RMax( r1, r2 : real ) : real;
  38.  
  39. FUNCTION RMin( r1, r2 : real ) : real;
  40.  
  41. FUNCTION RBound( r, Low, High : Real ) : Real;
  42.  
  43. FUNCTION RSgn( r : real ) : real;
  44.  
  45. FUNCTION RSign ( R : Real ): Real;
  46.  
  47. FUNCTION Ceil ( X : Real ): Real;
  48.  
  49. FUNCTION Factorial ( N : Integer ) : LongInt;
  50.  
  51. FUNCTION C ( N, I : Integer ) : LongInt;
  52.  
  53. FUNCTION ArcTan2 ( DeltaX, DeltaY : Real ): Real;
  54.  
  55. FUNCTION RadiansToDegrees( Radians : real ) : real;
  56.  
  57. FUNCTION DegreesToRadians( Degrees : real ) : real;
  58.  
  59. FUNCTION Dist3D ( X1,Y1,Z1, X2,Y2,Z2: Real ): Real;
  60.  
  61. FUNCTION NumBits ( L : LongInt ) : Integer;
  62.  
  63. IMPLEMENTATION
  64.  
  65. FUNCTION Max( i1, i2 : integer ) : integer;
  66.     BEGIN
  67.     IF i1 > i2 THEN
  68.         Max := i1
  69.     ELSE
  70.         Max := i2
  71.     END;  (* Max *)
  72.  
  73. FUNCTION Min( i1, i2 : integer ) : integer;
  74.     BEGIN
  75.     IF i1 > i2 THEN
  76.         Min := i2
  77.     ELSE
  78.         Min := i1
  79.     END;  (* Min *)
  80.  
  81. FUNCTION Bound( i, Low, High : Integer ) : Integer;
  82.     BEGIN
  83.     IF i < Low THEN
  84.         Bound := Low
  85.     ELSE IF i > High THEN
  86.         Bound := High
  87.     ELSE
  88.         Bound := i
  89.     END;  (* Bound *)
  90.  
  91. FUNCTION Sgn( i : real ) : integer;
  92.     BEGIN
  93.     IF i = 0 THEN
  94.         Sgn := 0
  95.     ELSE IF i > 0 THEN
  96.         Sgn := 1
  97.     ELSE
  98.         Sgn := -1
  99.     END;  (* Sgn *)
  100.  
  101. FUNCTION Sign ( I : Integer ): Integer;
  102.     BEGIN
  103.     IF I < 0 THEN
  104.         Sign := -1
  105.     ELSE
  106.         Sign := 1;
  107.     END;  (* Sign *)
  108.  
  109. FUNCTION RMax( r1, r2 : real ) : real;
  110.     BEGIN
  111.     IF r1 > r2 THEN
  112.         RMax := r1
  113.     ELSE
  114.         RMax := r2
  115.     END;  (* RMax *)
  116.  
  117. FUNCTION RMin( r1, r2 : real ) : real;
  118.     BEGIN
  119.     IF r1 > r2 THEN
  120.         RMin := r2
  121.     ELSE
  122.         RMin := r1
  123.     END;  (* RMin *)
  124.  
  125. FUNCTION RBound( r, Low, High : Real ) : Real;
  126.     BEGIN
  127.     IF r < Low THEN
  128.         RBound := Low
  129.     ELSE IF r > High THEN
  130.         RBound := High
  131.     ELSE
  132.         RBound := r
  133.     END;  (* RBound *)
  134.  
  135. FUNCTION RSgn( r : real ) : real;
  136.     BEGIN
  137.     IF r = 0.0 THEN
  138.         RSgn := 0.0
  139.     ELSE IF r > 0.0 THEN
  140.         RSgn := 1.0
  141.     ELSE
  142.         RSgn := -1.0
  143.     END;  (* RSgn *)
  144.  
  145. FUNCTION RSign ( R : Real ): Real;
  146.     BEGIN
  147.     IF R < 0 THEN
  148.         RSign := -1.0
  149.     ELSE
  150.         RSign := 1.0;
  151.     END;  (* RSign *)
  152.  
  153. FUNCTION Ceil ( X : Real ): Real;
  154.     BEGIN
  155.     IF Frac(X) <> 0.0 THEN
  156.         Ceil := Int(X)+1.0
  157.     ELSE
  158.         Ceil := Int(X);
  159.     END;  (* Ceil *)
  160.  
  161. FUNCTION Factorial ( N : Integer ) : LongInt;
  162.     VAR
  163.     F    : LongInt;
  164.     BEGIN
  165.     F := 1;
  166.     WHILE N > 1 DO BEGIN
  167.         F := F * N;
  168.         Dec(N)
  169.       END;
  170.     Factorial := F
  171.     END;    (* C *)
  172.  
  173. FUNCTION C ( N, I : Integer ) : LongInt;
  174.     VAR
  175.     J,R,D    : LongInt;
  176.     BEGIN
  177.     (* N! / (I! * (N-I)!) *)
  178.     (* N*(n-1)*(n-2)*..*(n-i+1) / i! *)
  179.     r := 1;
  180.     d := 1;
  181.     FOR J := 1 TO I DO BEGIN
  182.         R := R * (N-J+1);
  183.         D := D * J
  184.       END;
  185.     C := R DIV D
  186.     END;    (* C *)
  187.  
  188. FUNCTION ArcTan2 (DeltaX, DeltaY: Real): Real;
  189.     (* Returns the angle (in radians) represented by DeltaX and DeltaY. *)
  190.     (* Value returned is in range -Pi (exclusive) to +Pi (inclusive).   *)
  191.     VAR
  192.     Angle: Real;
  193.     BEGIN  (* ArcTan2 *)
  194.     IF DeltaX = 0.0 THEN
  195.         ArcTan2 := RSign(DeltaY) * Pi / 2.0
  196.     ELSE BEGIN
  197.         Angle := ArcTan(DeltaY/DeltaX);
  198.         IF DeltaX < 0.0 THEN
  199.         Angle := Angle + RSign(DeltaY) * Pi;
  200.         ArcTan2 := Angle;
  201.       END;
  202.     END;  (* ArcTan2 *)
  203.  
  204. FUNCTION RadiansToDegrees( Radians : real ) : real;
  205.     BEGIN
  206.     RadiansToDegrees := Radians * 180.0 / Pi
  207.     END;  (* RadiansToDegrees *)
  208.  
  209. FUNCTION DegreesToRadians( Degrees : real ) : real;
  210.     BEGIN
  211.     DegreesToRadians := Degrees * Pi / 180.0
  212.     END;  (* DegreesToRadians *)
  213.  
  214. FUNCTION Dist3D (X1,Y1,Z1, X2,Y2,Z2: Real): Real;
  215.     (* Returns distance between 2 points in 3-D space. *)
  216.     BEGIN
  217.     Dist3D := Sqrt(Sqr(X2-X1)+Sqr(Y2-Y1)+Sqr(Z2-Z1));
  218.     END;  (* Dist3D *)
  219.  
  220. {$L NumBits.OBJ}
  221. FUNCTION NumBits ( L : LongInt ) : Integer;
  222.     External;
  223. {
  224.     VAR
  225.     I    : Integer;
  226.     BEGIN
  227.     I := 0;
  228.     REPEAT
  229.         Inc(I);
  230.         L := (L SHR 1) AND $7fffffff;    (* strip sign *)
  231.     UNTIL L=0;
  232.     NumBits := I
  233.     END;    (* NumBits *)
  234. }
  235.  
  236. END.
  237.